package win.larryzeal.spring.jmx.server.jmxserverdemo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.EnableMBeanExport;
import org.springframework.jmx.support.ConnectorServerFactoryBean;
import org.springframework.jmx.support.RegistrationPolicy;
import org.springframework.remoting.rmi.RmiRegistryFactoryBean;

import javax.management.MalformedObjectNameException;

/**
 * Created by 张少昆 on 2017/8/23 0023.
 */
@Configuration
@EnableMBeanExport
public class JmxServerConfig {

	/**
	 * 也可以使用RmiServiceExporter自动创建一个RMI registry。
	 *
	 * @return
	 */
	@Bean
	public RmiRegistryFactoryBean rmiRegistryFactoryBean(){
		RmiRegistryFactoryBean rmiRegistryFactoryBean = new RmiRegistryFactoryBean();
		rmiRegistryFactoryBean.setPort(1099);// 这里是端口

		return rmiRegistryFactoryBean;
	}

	/**
	 * 使MBean成为远程对象的最简单方式。
	 * 它会创建和启动JSR-160 JMXConnectorServer。
	 * 默认，使用JMXMP协议，并监听9875端口 - 因此，它将绑定"service:jmx:jmxmp://localhost:9875"。
	 * 但，我们到处MBean的可选方案并不局限于JMXMP。
	 * 为MBean绑定不同的远程访问协议，我们仅需要设置其serviceUrl属性。
	 * 如使用RMI：
	 *
	 * @return
	 */
	@Bean
	@DependsOn("rmiRegistryFactoryBean") //必须
	public ConnectorServerFactoryBean connectorServerFactoryBean() throws MalformedObjectNameException{
		ConnectorServerFactoryBean connectorServerFactoryBean = new ConnectorServerFactoryBean();
		connectorServerFactoryBean.setObjectName("connector:name=rmi");
		connectorServerFactoryBean.setServiceUrl("service:jmx:rmi://localhost/jndi/rmi://localhost:1099/test"); //端口，见rmiRegistryFactoryBean()。

		return connectorServerFactoryBean;
	}

}
